numpy broadcast
以下、broadcastだけでなく、np.newaxisの使い方も参考になる
dist_sq = np.sum((X[:, np.newaxis, :] - X[np.newaxis, :, :]) ** 2, axis=-1)
これで、二次元の点のお互いの距離(の二乗和)がでる。 分散共分散行列 の形と同じで、三角部分をみればよい。 点が10個なら、$ \sum_1^9iで、45個の距離計算. np.add.reduce(np.arange(1,10))
2次元のものに、距離の指標を新たに加えるので、3次元になるか。
https://gyazo.com/d21252663b3c008092bec44cf2e66cba
ノートにいろいろ書いて考えたけど、なじむかな。。結構、使う場面ありそうな....意識すると。
掛け合わせは、よくあるはずなので。
broadcastのルール
同じ記事だけど、ここの broadcastのruleがまとまっていて、でもそれだけだとあやふやだった。
が、続く例示がクリアにしてくれる。
ちょっと訳出しで、負荷をかけてみる。
numpyのbroadcastingは、厳格なルールに従って決まる。 broadcastingは、2つのnp.arrayの作用のことで。
Rule1: 2つのnp.arrayのdimensions数が違う場合、少ないdimension数の方をpaddedさせる。 padded with ones on its leading (left) side. の意味が重要... dimension数を合うように1で埋める.
(3,2)を dimension数を3にしたいなら、1を左から埋めて (1,3,2)
Rule2: (dimension数を合わせた後), dimension上の要素数?がマッチしない場合は、shapeが1の場合、拡張してshapeを合わせる. 1じゃない場合であわなければ、エラーで、計算しない。
> (3,1) vs (3,) なら rule1で(3,1) vs (1,3), rule2で、(3,1) vs (3,3) さらに (3,3) vs (3,3)となる
手続き的には、理解したけど、これで本当に、いろんなことが上手くいくのか?? 上を見ると上手くいくのか。
broadcastのイメージとしては、配列(tensor?)の一番内側から外側に向かう動作。
(新しい)軸を作って、要素数を合わせて、元の数値を増殖させて、2つのarrayを相似形にする。